TypeScript 98.3%
CSS 0.9%
Shell 0.7%
1// Rétroaction sur un message : 👍/👎, signalement, sauvegarde en bibliothèque.2import { NextResponse } from "next/server";3import { z } from "zod";4import { apiError, parseBody } from "@/lib/api.ts";5import { assertSameOrigin, requireUser } from "@/lib/auth/session.ts";6import { get, run } from "@/lib/db/index.ts";78const schema = z.object({9 feedback: z.union([z.literal(-1), z.literal(0), z.literal(1)]).optional(),10 flag: z.boolean().optional(),11 flagReason: z.string().max(500).optional(),12 save: z.boolean().optional(),13});1415export async function PATCH(req: Request, ctx: { params: Promise<{ id: string }> }) {16 try {17 await assertSameOrigin();18 const user = await requireUser();19 const id = parseInt((await ctx.params).id, 10);20 const msg = get<{ id: number; conversation_id: number; content: string; user_id: number; course_code: string | null }>(21 `SELECT m.id, m.conversation_id, m.content, c.user_id, c.course_code FROM messages m22 JOIN conversations c ON c.id = m.conversation_id WHERE m.id = ?`,23 id24 );25 if (!msg || msg.user_id !== user.id) return NextResponse.json({ error: "Message introuvable." }, { status: 404 });26 const body = await parseBody(req, schema);27 if (body.feedback !== undefined) run("UPDATE messages SET feedback = ? WHERE id = ?", body.feedback, id);28 if (body.flag) {29 run("UPDATE messages SET flagged = 1 WHERE id = ?", id);30 run("INSERT INTO report_flags (message_id, user_id, reason) VALUES (?, ?, ?)", id, user.id, body.flagReason ?? "");31 }32 if (body.save) {33 run("UPDATE messages SET saved = 1 WHERE id = ?", id);34 run(35 "INSERT INTO saved_items (user_id, kind, course_code, title, content, meta) VALUES (?, 'answer', ?, ?, ?, ?)",36 user.id, msg.course_code, msg.content.replace(/\s+/g, " ").slice(0, 80), msg.content, JSON.stringify({ messageId: id })37 );38 }39 return NextResponse.json({ ok: true });40 } catch (e) {41 return apiError(e);42 }43}44